#ifndef SStructMG_STENCIL_PATTERNS_HPP
#define SStructMG_STENCIL_PATTERNS_HPP

constexpr __int128_t stencil_mask_0d1 = 8192;// bin2dec('000000000000010000000000000')
const int stencil_offset_0d1[1 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
};

/*  
                  /--------------/                    
                 /|    1        /|                   
                /-|-----------/  |
               |  |           |  |
               |  |-----------|--|
   z   y       |  |    0      |  |
   ^  ^        |--|-----------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /            | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_sk_1d2i2 = 24576;// bin2dec('000 000 000 000 110 000 000 000 000')
const int stencil_offset_sk_1d2i2[3 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    0,  0,  1, // 1 
};
constexpr __int128_t stencil_mask_sk_1d2i1 = 73728;// bin2dec('000 000 000 010 010 000 000 000 000')
const int stencil_offset_sk_1d2i1[3 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    0,  1,  0, // 1 
};
constexpr __int128_t stencil_mask_sk_1d2i0 = 4202496;// bin2dec('000 010 000 000 010 000 000 000 000')
const int stencil_offset_sk_1d2i0[3 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    1,  0,  0, // 1 
};

constexpr __int128_t stencil_mask_1d3i2 = 28672;// bin2dec('000 000 000 000 111 000 000 000 000')
const int stencil_offset_1d3i2[3 * 3] = {
    // y , x , z
    0,  0, -1, // 0
    0,  0,  0, // 1 
    0,  0,  1, // 2 
};
constexpr __int128_t stencil_mask_1d3i1 = 74752;// bin2dec('000 000 000 010 010 010 000 000 000')
const int stencil_offset_1d3i1[3 * 3] = {
    // y , x , z
    0, -1,  0, // 0
    0,  0,  0, // 1 
    0,  1,  0, // 2 
};
constexpr __int128_t stencil_mask_1d3i0 = 4202512;// bin2dec('000 010 000 000 010 000 000 010 000')
const int stencil_offset_1d3i0[3 * 3] = {
    // y , x , z
   -1,  0,  0, // 0
    0,  0,  0, // 1 
    1,  0,  0, // 2 
};

/*  
                  /--------------/                    
                 /|    1        /|                   
                /-|-----------/  |
               |  |           |  |
               |  |-----------|--|
   z   y       |  |    0      |2 |
   ^  ^        |--|-----------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /            | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_sk_2d3i1i2 = 90112;// bin2dec('000000000010110000000000000')
const int stencil_offset_sk_2d3i1i2[3 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    0,  0,  1, // 1 
    0,  1,  0, // 2 
};

/*  
                  /--------------/                    
                 /|    1        /|                   
                /-|-----------/  |
               |  |           |  |
               |  |------2----|--|
   z   y       |  |    0      |  |
   ^  ^        |--|-----------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /            | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_sk_2d3i0i2 = 4218880;// bin2dec('000 010 000 000 110 000000000000')
const int stencil_offset_sk_2d3i0i2[3 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    0,  0,  1, // 1 
    1,  0,  0, // 2 
};

/*  
                  /--------------/                    
                 /|             /|                   
                /-|-----------/  |
               |  |           |  |
               |  |------2----|--|
   z   y       |  |    0      |1 |
   ^  ^        |--|-----------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /            | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_sk_2d3i0i1 = 4268032;// bin2dec('000 010 000 010 010 000000000000')
const int stencil_offset_sk_2d3i0i1[3 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    0,  1,  0, // 1 
    1,  0,  0, // 2 
};

/*  
                  /--------------/                    
                 /|    3        /|                   
                /-|-----------/  |
               |  |           |  |
               |  |-----------|--|
   z   y       | 0|    2      |4 |
   ^  ^        |--|-----------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /     1      | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_2d5i1i2 = 95232;// bin2dec('000000000010111010000000000')
const int stencil_offset_2d5i1i2[5 * 3] = {
    // y , x , z
    0, -1,  0, // 0             ---3---
    0,  0, -1, // 1            |       |
    0,  0,  0, // 2        z   0   2   4
    0,  0,  1, // 3        ^   |       |
    0,  1,  0, // 4        |    ---1--- 
                  //       O ---> x        数据排布z内维先变
};

/*  
                  /--------------/                    
                 /|             /|                   
                /-|-----------/  |
               |  |           |  |
               |  |-----3-----|--|
   z   y       | 0|    2      |4 |
   ^  ^        |--|---1-------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /            | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_2d5i0i1 = 4269072;// bin2dec('000010000010010010000010000')
const int stencil_offset_2d5i0i1[5 * 3] = {
    // y , x , z
    -1,  0, 0, // 0  
     0, -1, 0, // 1  
     0,  0, 0, // 2  
     0,  1, 0, // 3  
     1,  0, 0, // 4  
};


/*  
                  /--------------/                    
                 /|    3        /|                   
                /-|-----------/  |
               |  |           |  |
               |  |-----4-----|--|
   z   y       |  |    2      |  |
   ^  ^        |--|---0-------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /     1      | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_2d5i0i2 = 4222992;// bin2dec('000 010 000 000 111 000 000 010 000')
const int stencil_offset_2d5i0i2[5 * 3] = {
    // y , x , z
    -1,  0,  0, // 0  
     0,  0, -1, // 1  
     0,  0,  0, // 2  
     0,  0,  1, // 3  
     1,  0,  0, // 4  
};


/*  
                  /--------------/                    
                 /|    1       3/|                   
                /-|-----------/  |
               |  |           |  |
               |  |-----------|--|
   z   y       |  |    0      |2 |
   ^  ^        |--|-----------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /            | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_sk_2d4i1i2 = 221184;// bin2dec('000000000110110000000000000')
const int stencil_offset_sk_2d4i1i2[4 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    0,  0,  1, // 1 
    0,  1,  0, // 2 
    0,  1,  1, // 3
};

/*  
                  /------3-------/                    
                 /|    1        /|                   
                /-|-----------/  |
               |  |           |  |
               |  |------2----|--|
   z   y       |  |    0      |  |
   ^  ^        |--|-----------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /            | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_sk_2d4i0i2 = 12607488;// bin2dec('000 110 000 000 110 000000000000')
const int stencil_offset_sk_2d4i0i2[4 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    0,  0,  1, // 1 
    1,  0,  0, // 2 
    1,  0,  1, // 3
};

/*  
                  /--------------/                    
                 /|             /|                   
                /-|-----------/  |
               |  |           |  |
               |  |------2----|--3
   z   y       |  |    0      |1 |
   ^  ^        |--|-----------|  |
   | /         |  |           |  |
   |/          |  /-----------|--/ 
   O-------> x | /            | / 
               |/-------------|/
*/
constexpr __int128_t stencil_mask_sk_2d4i0i1 = 37822464;// bin2dec('010 010 000 010 010 000000000000')
const int stencil_offset_sk_2d4i0i1[4 * 3] = {
    // y , x , z
    0,  0,  0, // 0 
    0,  1,  0, // 1 
    1,  0,  0, // 2 
    1,  1,  0, // 3
};

/*  
                  /--------------/                    
                 2 |    5       8 |                   
                /--|-----------/  |
               |   |           |  |
               |   |-----------|--|
   z   y       | 1 |    4      |7 |
   ^  ^        |---|-----------|  |
   | /         |   |           |  |
   |/          |   /-----------|--/ 
   O-------> x | 0      3      |6 
               |/--------------|/
*/
constexpr __int128_t stencil_mask_2d9i1i2 = 261632;// bin2dec('000000000111111111000000000')
const int stencil_offset_2d9i1i2[9 * 3] = {
    // y , x , z
    0, -1, -1, // 0     
    0, -1,  0, // 1            2---5---8
    0, -1,  1, // 2            |       |
    0,  0, -1, // 3        z   1   4   7
    0,  0,  0, // 4        ^   |       |
    0,  0,  1, // 5        |   0---3---6
    0,  1, -1, // 6        O ---> x 
    0,  1,  0, // 7        数据排布z内维先变
    0,  1,  1  // 8
};

/*  
                  /--------------/                    
                 / |            / |                   
                /--|-----------/  |
               |   |           |  |
               |   2-----5-----|--8
   z   y       | 1 |    4      |7 |
   ^  ^        0---|---3-------6  |
   | /         |   |           |  |
   |/          |   /-----------|--/ 
   O-------> x | /             | /
               |/--------------|/
*/
constexpr __int128_t stencil_mask_2d9i0i1 = 38347922;// bin2dec('010010010010010010010010010')
const int stencil_offset_2d9i0i1[9 * 3] = {
    // y , x , z
    -1, -1, 0,// 0
    -1,  0, 0,// 1
    -1,  1, 0,// 2
     0, -1, 0,// 3
     0,  0, 0,// 4
     0,  1, 0,// 5
     1, -1, 0,// 6
     1,  0, 0,// 7
     1,  1, 0 // 8
};

/*  
                  /------8-------/                    
                 / |    5       / |                   
                /--|---2-------/  |
               |   |           |  |
               |   |-----7-----|--
   z   y       |   |    4      |  |
   ^  ^        |---|---1-------   |
   | /         |   |           |  |
   |/          |   /-----6-----|--/ 
   O-------> x | /      3      | /
               |/------0-------|/
*/
constexpr __int128_t stencil_mask_2d9i0i2 = 14708792;// bin2dec('000 111 000 000 111 000 000 111 000')
const int stencil_offset_2d9i0i2[9 * 3] = {
    // y , x , z
    -1, 0, -1,// 0
    -1, 0,  0,// 1
    -1, 0,  1,// 2
     0, 0, -1,// 3
     0, 0,  0,// 4
     0, 0,  1,// 5
     1, 0, -1,// 6
     1, 0,  0,// 7
     1, 0,  1,// 8
};

/*  
                  /--------------/                    
                 / |    1       / |                   
                /--|-----------/  |
               |   |           |  |
               |   |------3----|--|
   z   y       |   |    0      | 2|
   ^  ^        |---|--   ------|  |
   | /         |   |           |  |
   |/          |   /-----------|--/ 
   O-------> x | /             | / 
               |/--------------|/
*/
constexpr __int128_t stencil_mask_sk_3d4 = 4284416;// bin2dec('000010000010111010000010000')
const int stencil_offset_sk_3d4[4 * 3] = {
    // y , x , z
    0,  0,  0,
    0,  0,  1,
    0,  1,  0,
    1,  0,  0 
};


/*  
                  /--------------/                    
                 / |    4       / |                   
                /--|-----------/  |
               |   |           |  |
               |   |------6----|--|
   z   y       | 1 |    3      | 5|
   ^  ^        |---|-- 0 ------|  |
   | /         |   |           |  |
   |/          |   /-----------|--/ 
   O-------> x | /      2      | / 
               |/--------------|/
*/
constexpr __int128_t stencil_mask_3d7 = 4289552;// bin2dec('000010000010111010000010000')
const int stencil_offset_3d7[7 * 3] = {
    // y , x , z
    -1, 0,  0, // 0
    0, -1,  0, // 1
    0,  0, -1, // 2
    0,  0,  0, // 3
    0,  0,  1, // 4
    0,  1,  0, // 5
    1,  0,  0  // 6
};

/*  
                  /--------------/                    
                 3 |    6       9 |                   
                /--|-----------/  |
               |   |           |  |
               |   |-----10----|--|
   z   y       | 2 |    5      | 8|
   ^  ^        |---|-- 0 ------|  |
   | /         |   |           |  |
   |/          |   /-----------|--/ 
   O-------> x | 1      4      | 7 
               |/--------------|/
*/
constexpr __int128_t stencil_mask_3d11 = 4455952;// bin2dec('000010000111111111000010000')
const int stencil_offset_3d11[11 * 3] = {
    // y , x , z
    -1, 0,  0, // 0
    0, -1, -1, // 1
    0, -1,  0, // 2
    0, -1,  1, // 3
    0,  0, -1, // 4
    0,  0,  0, // 5
    0,  0,  1, // 6
    0,  1, -1, // 7
    0,  1,  0, // 8
    0,  1,  1, // 9
    1,  0,  0  // 10
};

/*
                    /----- 12 -----14                   
                  / |    8       10|                   
                /---|-----------/  |
               |    |           |  |
               |    |----- 11 --|- 13
   z   y       |  5 |    7      | 9|
   ^  ^        1 ---|-- 3 ------|  |
   | /         |    |           |  |
   |/          |    /-----------|--/ 
   O-------> x |  4      6      | / 
               0/------ 2 ------|/
*/
constexpr __int128_t stencil_mask_3d15 = 113473051;// bin2dec('110110000110111011000011011')
const int stencil_offset_3d15[15 * 3] = {
  -1, -1, -1,
  -1, -1,  0,
  -1,  0, -1,
  -1,  0,  0,

  0, -1, -1,
  0, -1,  0,
  0,  0, -1,
  0,  0,  0,
  0,  0,  1,
  0,  1,  0,
  0,  1,  1,

  1,  0,  0,
  1,  0,  1,
  1,  1,  0,
  1,  1,  1,
};


/*  
                  /-------5------/                    
                 / |    1       3 |                   
                /--|-----------/  |
               |   |           |  |
               |   |------4----|--6
   z   y       |   |    0      | 2|
   ^  ^        |---|--   ------|  |
   | /         |   |           |  |
   |/          |   /-----------|--/ 
   O-------> x | /             | / 
               |/--------------|/
*/
constexpr __int128_t stencil_mask_sk_3d7 = 46358528;// bin2dec('010110000110110000000000000')
const int stencil_offset_sk_3d7[7 * 3] = {
  // y , x , z 从外到内维
  0,  0,  0,
  0,  0,  1,
  0,  1,  0,
  0,  1,  1,
  1,  0,  0,
  1,  0,  1,
  1,  1,  0 
};

/*
                    /----- 17 -----/                    
                  7 |    10      13|                   
                /---|-- 3 ------/  |
               |    |           |  |
               |    14---- 16 --|- 18
   z   y       |  6 |    9      |12|
   ^  ^        0 ---|-- 2 ----- 4  |
   | /         |    |           |  |
   |/          |    /----- 15 --|--/ 
   O-------> x |  5      8      |11 
               |/------ 1 ------|/
*/
constexpr __int128_t stencil_mask_3d19 = 49020602;// bin2dec('010111010111111111010111010')
const int stencil_offset_3d19[19 * 3] = {
  // y , x , z 从外到内维
  -1, -1,  0,// 0
  -1,  0, -1,// 1
  -1,  0,  0,// 2
  -1,  0,  1,// 3
  -1,  1,  0,// 4

  0, -1, -1,// 5
  0, -1,  0,// 6
  0, -1,  1,// 7
  0,  0, -1,// 8
  0,  0,  0,// 9
  0,  0,  1,// 10
  0,  1, -1,// 11
  0,  1,  0,// 12
  0,  1,  1,// 13

  1, -1,  0,// 14
  1,  0, -1,// 15
  1,  0,  0,// 16
  1,  0,  1,// 17
  1,  1,  0 // 18
};

/*  
                  /-------5------ 7                   
                 / |    1       3 |                   
                /--|-----------/  |
               |   |           |  |
               |   |------4----|--6
   z   y       |   |    0      | 2|
   ^  ^        |---|--   ------|  |
   | /         |   |           |  |
   |/          |   /-----------|--/ 
   O-------> x | /             | / 
               |/--------------|/
*/
constexpr __int128_t stencil_mask_sk_3d8 = 113467392;// bin2dec('000010000010111010000010000')
const int stencil_offset_sk_3d8[8 * 3] = {
    // y , x , z
    0,  0,  0,
    0,  0,  1,
    0,  1,  0,
    0,  1,  1,
    1,  0,  0,
    1,  0,  1,
    1,  1,  0,
    1,  1,  1,
};

/*  
                  /20--- 23------26
                 11|    14      17|
               2---|---5-------8  |
               |   |           |  |
               |   19----22----|-25
   z   y       | 10|    13     |16|
   ^  ^        1---|-- 4 ------7  |
   | /         |   |           |  |
   |/          |   18----21----|-24 
   O-------> x | 9      12     |15 
               0/------3-------6/
*/
constexpr __int128_t stencil_mask_3d27 = 134217727; // bin2dec('111111111111111111111111111')
const int stencil_offset_3d27[27 * 3] = {
  // y , x , z
  -1, -1, -1,
  -1, -1,  0,
  -1, -1,  1,
  -1,  0, -1,
  -1,  0,  0,
  -1,  0,  1,
  -1,  1, -1,
  -1,  1,  0,
  -1,  1,  1,

  0, -1, -1,
  0, -1,  0,
  0, -1,  1,
  0,  0, -1,
  0,  0,  0,
  0,  0,  1,
  0,  1, -1,
  0,  1,  0,
  0,  1,  1,

  1, -1, -1,
  1, -1,  0,
  1, -1,  1,
  1,  0, -1,
  1,  0,  0,
  1,  0,  1,
  1,  1, -1,
  1,  1,  0,
  1,  1,  1
};

#endif